package com.springboot3knife4jtest.Config;

import com.github.xiaoymin.knife4j.spring.configuration.Knife4jAutoConfiguration;
import io.swagger.v3.oas.models.info.Info;
import org.springdoc.core.customizers.OpenApiCustomizer;
import org.springdoc.core.models.GroupedOpenApi;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * SpringDoc 配置类
 * 用于配置 API 文档生成和 Swagger UI 资源映射
 */
@Configuration // 标记为配置类，Spring Boot 启动时会自动加载
public class SpringDocConfig implements WebMvcConfigurer {

    /**
     * 配置静态资源映射
     * 用于正确加载 Swagger UI 所需的静态资源文件
     * @param registry 资源处理器注册表
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        // 映射 Swagger UI HTML 页面
        registry.addResourceHandler("/swagger-ui.html")
                .addResourceLocations("classpath:/META-INF/resources/");
        // 映射 WebJars 资源（Swagger UI 依赖的CSS、JS等文件）
        registry.addResourceHandler("/webjars/**")
                .addResourceLocations("classpath:/META-INF/resources/webjars/");
    }

    /**
     * 自定义 OpenAPI 配置
     * 用于设置 API 文档的全局信息
     * @return OpenApiCustomizer 自定义配置器
     */
    @Bean
    public OpenApiCustomizer openApiCustomizer() {
        return openApi -> {
            // 为所有接口操作添加默认标签
            openApi.getPaths().values().stream()
                    .flatMap(pathItem -> pathItem.readOperations().stream())
                    .forEach(operation -> operation.addTagsItem("default"));

            // 设置 API 文档基本信息
            openApi.setInfo(new Info()
                    .title("API 文档")        // 文档标题
                    .version("1.0.0"));       // API 版本号

            // 设置联系信息
            openApi.getInfo().getContact()
                    .name("stylts")             // 联系人姓名
                    .email("duobao@example.com"); // 联系人邮箱
        };
    }

    /**
     * 配置默认分组的 OpenAPI
     * 定义要扫描的控制器包路径和匹配规则
     * @return GroupedOpenApi 分组API配置
     */
    @Bean
    public GroupedOpenApi defaultGroupedOpenApi() {
        return GroupedOpenApi.builder()
                .group("default")                             // 分组名称
                .pathsToMatch("/**")                          // 匹配所有路径
                .packagesToScan("com.springboot3knife4jtest.Controller") // 扫描的控制器包路径
                .build();
    }
}